/**
 * 1. 基本情况
 * let: 变量
 * const: 常量（如果是引用类型，可以修改内部的属性）
 * 均不可重复定义变量
 */

/**
 * 2. let和const没有作用域提升
 * 实际上变量已经在词法分析的时候被创建出来了，只是不能被访问
 */
// Cannot access 'foo' before initialization
// console.log(foo)
// let foo = 'foo'

/**
 * 3.let-const和window的关系
 * ①早期的ECMA规范中，执行上下文中会创建一个变量环境（variable object，VO）
 *   在源代码中的函数和变量都会存在VO中，对于函数来说，参数也会被添加到VO中
 *   全局上下文中的VO就是window
 *   var 声明的变量会添加到window中
 * ②在最新的ECMA规范中，执行上下文会创建一个变量环境(variable environment,VE)
 *   在执行代码中的变量和函数的声明会作为环境记录(environment record)添加到VE中，
 *   对于函数来说，参数也会作为环境记录添加到其中
 *   let\const声明的变量不会被添加到window中，而是保存在VariableMap中（V8引擎）
 */
let a = 'a'
console.log(a)
console.log(window.a)//undefined
console.log(window)
